不同场景中的this

  • 处于被对象调用的方法中
  • 处于普通函数中
  • 在构造函数中

this的指向简单来说就是:

谁调用,就指向谁

在对象的方法中

var obj = {
    name: '二狗子',
    bark: function(){
        console.log(this);
        // obj
        console.log('汪汪汪');
    }
};

obj.bark();

调用者是obj,按照上面的简单规则谁调用就指向谁所以这里的this就是obj

在普通函数中

var bark = function () {
  console.log(this);
  // window 
}

// 注意前面没有obj
bark();

全局环境下所有的属性方法都属于window,所以这里其实隐藏了一个window,也是window.bark()。·

再参照谁调用就指向谁,所以这里的this就是window

在构造函数中

构造函数其实跟普通函数没有任何区别,在没有使用new修饰符的时候,函数就是函数,只有加了new后,才成为了构造函数。

function func1(){}

function func2(){}

func1();
// 普通函数调用

new func1();
// 构造函数调用

构造函数的作用?

它会返回一个对象

function func1() {
  this.name = '一号狗子';
}

function func2() {
  this.name = '二号狗子';
}

var dog = new func1();
// dog1获得了一个对象

var dog = func2();
// dog2什么都没有,因为函数没有返回任何东西

当对函数使用new修饰符时,函数的内部的this的指向则是返回的那个对象,这是js引擎的行为。

call apply

callapply的主要用途是改变this的指向,这两个方法属于function类型,所以只要一个变量的原型链上有function,那么它就有callapply方法。

用法:

var obj = {
  name: '二狗子',
  bark: function () {
    console.log(this);
  }
};

obj.bark();
// obj

// 修改bark内的this指向为window
obj.bark.apply(window);
// or
obj.bark.call(window);
// window

callapply只是在传参的时候有些差异。

call(thisArg, arg1, arg2, arg3)方法接受一个参数列表。
apply(thisArg, argsArray)方法接受一个包含多个参数的数组。


热饭班长
3.7k 声望434 粉丝

先去做,做出一坨狗屎,再改进。


« 上一篇
冒泡排序算法
下一篇 »
react组件解耦